import {EchartLayer} from "../echartLayer/EchartLayer";

export const WindFarm = class  {

  _viewManage = null;
  _chart = null;
  constructor(viewManage,windData){
    this._viewManage = viewManage;
    buildGrid(windData,this.initData.bind(this))
  }
  initData(header, grid){
    console.log(header,grid)
    var data = [];
    var p = 0;
    var maxMag = 0;
    var minMag = Infinity;
    for (var j = 0; j < header.ny; j++) {
      for (var i = 0; i < header.nx; i++) {
        var vx = grid[j][i][0];
        var vy = grid[j][i][1];
        var mag = Math.sqrt(vx * vx + vy * vy);
        var lng = i / header.nx * 360;
        if (lng >= 180) {
          lng = 180 - lng;
        }
        // 数据是一个一维数组
        // [ [经度, 维度，向量经度方向的值，向量维度方向的值] ]
        data.push([
          lng,
          90 - j / header.ny * 180,
          vx,
          vy,
          mag
        ]);
        maxMag = Math.max(mag, maxMag);
        minMag = Math.min(mag, minMag);
      }
    }
    let option = {
      visualMap: {
        show:false,
        left: 'right',
        min: minMag,
        max: maxMag,
        realtime:false,//拖拽时，是否实时更新。
        dimension: 4,
        inRange: {
          color: ['#fff', '#0f0', "#00f",'#ff0',"#f00"]
          // color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
        },
        calculable: true,
        textStyle: {
          color: '#fff'
        }
      },
      series: [{
        type: 'flowGL',
        coordinateSystem: 'arcgis',
        data: data,//向量场数据，包含向量的位置和向量的方向（包含大小）。flowGL 对数据的存储顺序和没有强制性要求，你甚至可以传入比较稀疏的向量数据。
        supersampling: 1,//默认1，画面的超采样比率，采用4的超采样可以有效的提高画面的清晰度，减少画面锯齿。但是因为需要处理更多的像素数量，所以也对性能有更高的要求。
        particleType: 'line',//默认point，粒子的类型，默认为点 'point'，可以设置成线 'line'，线类型的粒子会用一条线连接上个运动位置和当前运动位置。会让这个轨迹更加连贯
        particleDensity: 64,//默认128，粒子的密度，实际的粒子数量是设置数目的平方。粒子密度越大迹线效果越好，但是性能开销也会越大。
        particleSpeed: 1,//粒子的速度，默认为 1。注意在 particleType 为 'point' 的时候过大的速度会让整个轨迹变得断断续续
        particleSize: 1,//默认1，粒子的大小，如果 particleType 是 'line' 的话则会通过线宽的形式表现
        particleTrail:2,//默认2，粒子的轨迹长度，数值越大轨迹越长。
        // gridWidth: windData.nx,//传入的网格数据的网格宽度数量，flowGL 会根据这个值和 gridHeight 创建存储向量场的浮点纹理，用于粒子的轨迹计算。
        // gridHeight: windData.ny,//传入的网格数据的网格高度数量。
        itemStyle: {
          // color:"#f00",
          opacity: 0.5
        }
      }]
    };
    this._chart = new EchartLayer(this._viewManage, option,1000);
  }
  getChart(){
    return this._chart;
  }
}

// https://github.com/Esri/wind-js/blob/master/windy.js#L41
var createWindBuilder = function(uComp, vComp) {
  var uData = uComp.data,
    vData = vComp.data;
  return {
    header: uComp.header,
    //recipe: recipeFor("wind-" + uComp.header.surface1Value),
    data: function(i) {
      return [uData[i], vData[i]];
    }
  }
};

var createBuilder = function(data) {
  var uComp = null,
    vComp = null,
    scalar = null;
  data.forEach(function(record) {
    switch (record.header.parameterCategory + "," + record.header.parameterNumber) {
      case "2,2":
        uComp = record;
        break;
      case "2,3":
        vComp = record;
        break;
      default:
        scalar = record;
    }
  });

  return createWindBuilder(uComp, vComp);
};

var buildGrid = function(data, callback) {
  var builder = createBuilder(data);

  var header = builder.header;
  var λ0 = header.lo1,
    φ0 = header.la1; // the grid's origin (e.g., 0.0E, 90.0N)
  var Δλ = header.dx,
    Δφ = header.dy; // distance between grid points (e.g., 2.5 deg lon, 2.5 deg lat)
  var ni = header.nx,
    nj = header.ny; // number of grid points W-E and N-S (e.g., 144 x 73)
  var date = new Date(header.refTime);
  date.setHours(date.getHours() + header.forecastTime);

  // Scan mode 0 assumed. Longitude increases from λ0, and latitude decreases from φ0.
  // http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_table3-4.shtml
  var grid = [],
    p = 0;
  var isContinuous = Math.floor(ni * Δλ) >= 360;
  for (var j = 0; j < nj; j++) {
    var row = [];
    for (var i = 0; i < ni; i++, p++) {
      row[i] = builder.data(p);
    }
    if (isContinuous) {
      // For wrapped grids, duplicate first column as last column to simplify interpolation logic
      row.push(row[0]);
    }
    grid[j] = row;
  }
  callback(header, grid);
};
